<?php

/**
 * Работа с таблицей тендеров
 *
 * @author kingop
 */
class DatabaseObject_Tender extends DatabaseObject {

    public $project = null;
    public $cat = null;
    public $files = null;
    public $winner = null;

    public function __construct($db) {
        parent::__construct($db, 'tenders', 'id');

        // далее перечислены все поля таблицы
        $this->add('idProject');
        $this->add('name');
        $this->add('manager');
        $this->add('start_date');
        $this->add('end_date');
        $this->add('about');
        $this->add('idCat');
        $this->add('archive');
        $this->add('title');
        $this->add('keywords');
        $this->add('description');
        
        $this->winner = new DatabaseObject_TendersWinners($db);
    }

    protected function preDelete() {
        parent::preDelete();

        DatabaseObject_TendersFiles::DeleteTenderFiles($this->getDb(), $this->getId());
        return true;
    }

    public static function GetTenders($db, $options = array()) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'p.id'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // поля для выборки
        $select->from(null, 'p.*');

        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if ($options['where'])
            $select->where($options['where']);

        $select->order($options['order']);

        // получим данные из базы
        $data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $tenders = self::BuildMultiple($db, __CLASS__, $data);
        $tender_ids = array_keys($tenders);

        if (count($tender_ids) == 0)
            return array();

        foreach ($tenders as $tender) {
            $tender->project = new DatabaseObject_Project($db);
            $tender->project->load($tender->idProject);
        }
        return $tenders;
    }

    private static function _GetBaseQuery($db, $options) {
        // инициализация настроек
        $defaults = array();

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        // создание запроса на получение
        $select = $db->select();
        $select->from(array('p' => 'tenders'), array());

        return $select;
    }

    protected function postLoad() {
        parent::postLoad();

        // загрузим проект
        $this->project = new DatabaseObject_Project($this->getDb());
        $this->project->load($this->idProject);

        // загрузим категорию
        $this->cat = new DatabaseObject_Categories($this->getDb());
        $this->cat->load($this->idCat);

        // загрузим прикрпленные файлы
        $this->files = DatabaseObject_TendersFiles::GetTenderFiles($this->getDb(), $this->getId());
        
        // проверка на победителя
        $this->winner= DatabaseObject_TendersWinners::GetWinner($this->getDb(), $this->getId());
    }

    public static function FilterIds($db, $options) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'p.id'
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        // поля для выборки
        $select->from(null, 'p.*');

        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);
        if($options['where']) 
            $select->where($options['where']);

        $select->order($options['order']);
       //echo $select->__toString();
        // получим данные из базы
        $data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $tenders = self::BuildMultiple($db, __CLASS__, $data);
        $tender_ids = array_keys($tenders);

        if (count($tender_ids) == 0)
            return "";

        return implode(', ', $tender_ids);
    }

    
    public static function FilterTenders($db, $filter = array(), $options = array()) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'p.id'
        );
        $filters = array(
            'idCat' => array(),
            'idProject' => array(),
            'archive' => 2,
            'search' => ''
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);

        if (count($filter['idCat']) > 0)
            $idCat = implode(",", $filter['idCat']);
        if (count($filter['idProject']) > 0)
            $idProject = implode(",", $filter['idProject']);
        // поля для выборки
        $select->from(null, 'p.*');
        if ($idCat != '')
            $select->where('idCat in (' . $idCat . ')');
        if ($idProject != '')
            $select->where('idProject in (' . $idProject . ')');

        if (($filter['archive'] != '') && ($filter['archive'] != '2')) {
            $select->where('archive = ?', $filter['archive']);
        }

        if ($filter['search'] != '') {
            $select->where('`name` like \'%'.$filter[search].'%\' OR  `about` like \'%'.$filter[search].'%\'');
        }
        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);

        $select->order($options['order']);
       //echo $select->__toString();
        // получим данные из базы
        $data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $tenders = self::BuildMultiple($db, __CLASS__, $data);
        $tender_ids = array_keys($tenders);

        if (count($tender_ids) == 0)
            return array();

        foreach ($tenders as $tender) {
            $tender->project = new DatabaseObject_Project($db);
            $tender->project->load($tender->idProject);
            // проверка на победителя
        $tender->winner->load($tender->getId(), 'idTender'); /*= DatabaseObject_TendersWinners::GetWinner($db, $tender->getId());*/
        }
        
        
        return $tenders;
    }
    
    public static function GetFilterCount($db, $filter = array(), $options = array()) {
        // инициализируем настройки
        $defaults = array(
            'offset' => 0,
            'limit' => 0,
            'order' => 'p.id'
        );
        $filters = array(
            'idCat' => array(),
            'idProject' => array(),
            'archive' => 2,
            'search' => ''
        );

        foreach ($defaults as $k => $v) {
            $options[$k] = array_key_exists($k, $options) ? $options[$k] : $v;
        }

        foreach ($filters as $k => $v) {
            $filter[$k] = array_key_exists($k, $filter) ? $filter[$k] : $v;
        }

        $select = self::_GetBaseQuery($db, $options);
        

        if (count($filter['idCat']) > 0)
            $idCat = implode(",", $filter['idCat']);
        if (count($filter['idProject']) > 0)
            $idProject = implode(",", $filter['idProject']);
        // поля для выборки
        $select->from(null, 'count(*)');
        if ($idCat != '')
            $select->where('idCat in (' . $idCat . ')');
        if ($idProject != '')
            $select->where('idProject in (' . $idProject . ')');

        if (($filter['archive'] != '') && ($filter['archive'] != '2')) {
            $select->where('archive = ?', $filter['archive']);
        }

        if ($filter['search'] != '') {
            $select->where('`name` like \'%'.$filter[search].'%\' OR  `about` like \'%'.$filter[search].'%\'');
        }
        // зададим настройки
        if ($options['limit'] > 0)
            $select->limit($options['limit'], $options['offset']);

        $select->order($options['order']);
       //echo $select->__toString();
        // получим данные из базы
        /*$data = $db->fetchAll($select);

        // сделаем из полученных записей объекты класса
        $tenders = self::BuildMultiple($db, __CLASS__, $data);
        $tender_ids = array_keys($tenders);

        if (count($tender_ids) == 0)
            return array();

        foreach ($tenders as $tender) {
            $tender->project = new DatabaseObject_Project($db);
            $tender->project->load($tender->idProject);
        }
        return $tenders;*/
        
        return $db->fetchOne($select);
    }

    public static function GetCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');

        return $db->fetchOne($select);
    }

    public static function GetLiveCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('archive = 0');

        return $db->fetchOne($select);
    }

    public static function GetArchiveCount($db) {
        $select = self::_GetBaseQuery($db, array());
        $select->from(null, 'count(*)');
        $select->where('archive = 1');

        return $db->fetchOne($select);
    }

    public static function EndDateUpload($db, $id, $end) {
        $tender = new DatabaseObject_Tender($db);
        $tender->load($id);
        $tender->end_date = $end;
        $tender->save();

        return true;
    }

    public static function AutoArchive($db) {
        $tenders = self::GetTenders($db, array('where' => 'end_date < NOW()'));
        
        $query = "update tenders set archive = 1 where end_date < NOW()";
        $db->query($query);
        
        return $tenders;
    }
}

?>
